#include "im.h"
#include <QDebug>
#include <QLabel>
#include "cashier.h"
#include "stockin.h"
#include "stockinstatistics.h"
#include "salestatistics.h"
#include "salesanalysis.h"
#include "productmodel.h"
#include "productbrowsepanel.h"
#include "productbrowsepage.h"
#include "appinitializer.h"
#include "productdao.h"
#include "memberdao.h"
#include "inventorydao.h"
#include "orderservice.h"
#include "paymentprocessor.h"

// 构造函数：初始化成员变量并启动界面初始化
im::im (const QMap<QString, QVariant> &userInfo, QWidget *parent) : QWidget (parent)
{
// 初始化所有指针成员为 nullptr，避免野指针
m_topMenu = nullptr;
m_purchaseQueryBtn = nullptr;
m_warehouseQueryBtn = nullptr;
m_conditionManageBtn = nullptr;
m_systemManageBtn = nullptr;
m_helpBtn = nullptr;
m_stackedWidget = nullptr;
m_currentUser = userInfo;

// 从全局初始化器获取数据库实例（确保数据库连接统一管理）
m_db = AppInitializer::database ();

// 初始化主界面布局和组件
initUI ();
}

// 析构函数：Qt 对象树自动管理子组件内存，无需手动释放
im::~im ()
{
}

// 初始化主界面：创建主布局，整合顶部菜单和堆叠窗口
void im::initUI ()
{
// 创建主布局（垂直布局），设置边距和间距为 0，消除默认空隙
QVBoxLayout *mainLayout = new QVBoxLayout (this);
mainLayout->setContentsMargins (0, 0, 0, 0);
mainLayout->setSpacing (0);

// 创建顶部菜单，并添加到主布局顶部
createTopMenu ();
if (m_topMenu) {
mainLayout->addWidget (m_topMenu);
}

// 创建堆叠窗口（占满主布局剩余空间），用于页面切换
m_stackedWidget = new QStackedWidget (this);
if (m_stackedWidget) {
mainLayout->addWidget (m_stackedWidget, 1); // 权重 1：占满剩余空间

//创建商品入库界面
m_stockin = new StockIn(m_currentUser, this);

//商品入库容器
QWidget *stockin = new QWidget ();
stockin->setSizePolicy (QSizePolicy::Expanding, QSizePolicy::Expanding);
QVBoxLayout *stockinLayout = new QVBoxLayout (stockin);
stockinLayout->setContentsMargins (0, 0, 0, 0);
stockinLayout->setSpacing (0);

// 将入库面板添加到容器布局（占满容器）
stockinLayout->addWidget (m_stockin, 1);

// 将商品入库页面添加到堆叠窗口，并设置为默认显示页面（索引 0）
m_stackedWidget->addWidget (stockin);
m_stackedWidget->setCurrentIndex (0);


// 商品档案页面容器（用于整合数据模型和档案面板）
QWidget *browseContainer = new QWidget ();
browseContainer->setSizePolicy (QSizePolicy::Expanding, QSizePolicy::Expanding);

// 容器布局（垂直），消除默认边距和间距
QVBoxLayout *containerLayout = new QVBoxLayout (browseContainer);
containerLayout->setContentsMargins (0, 0, 0, 0);
containerLayout->setSpacing (0);

// 创建商品数据访问层（DAO）、数据模型、档案面板
Database *db = AppInitializer::database ();
ProductDAO *productDao = new ProductDAO (db); // 商品数据库操作对象
m_model = new ProductModel (productDao); // 商品数据模型（关联 DAO 与界面）
m_panel = new ProductBrowsePanel (m_model, browseContainer); // 商品档案面板（显示列表）
m_panel->setSizePolicy (QSizePolicy::Expanding, QSizePolicy::Expanding);

// 将档案面板添加到容器布局（占满容器）
containerLayout->addWidget (m_panel, 1);

// 将商品档案页面添加到堆叠窗口
m_stackedWidget->addWidget (browseContainer);

// 创建商品浏览页面（第三个堆栈窗口）
ProductDAO *productBrowseDao = new ProductDAO (db);
m_productBrowsePage = new ProductBrowsePage(productBrowseDao, this);
m_stackedWidget->addWidget(m_productBrowsePage);

// 创建入库统计页面（第四个堆栈窗口）
m_stockInStatistics = new StockInStatistics(m_currentUser, this);
m_stackedWidget->addWidget(m_stockInStatistics);

// 创建销售统计页面（第五个堆栈窗口）
m_saleStatistics = new SaleStatistics(m_currentUser, this);
m_stackedWidget->addWidget(m_saleStatistics);

// 创建销售分析页面（第六个堆栈窗口）
m_salesAnalysis = new SalesAnalysis(this);
m_stackedWidget->addWidget(m_salesAnalysis);
}

// 设置主界面最小尺寸，避免窗口过小导致组件错乱
this->setMinimumSize (1000, 700);
}

// 创建顶部菜单：按功能分区（进销存管理、统计分析、商品出库、系统功能）
void im::createTopMenu ()
{
// 创建顶部菜单容器
m_topMenu = new QWidget (this);
if (!m_topMenu) return;

// 设置顶部菜单样式：固定高度、背景色、底部边框
m_topMenu->setFixedHeight (110);
m_topMenu->setStyleSheet ("background-color: #E6F3FF; border-bottom: 1px solid #CCCCCC;");

// 顶部菜单主布局（水平），设置边距和间距
QHBoxLayout *mainMenuLayout = new QHBoxLayout (m_topMenu);
mainMenuLayout->setContentsMargins (10, 5, 10, 5);
mainMenuLayout->setSpacing (15);

//---------------------- 功能区 1：进销存管理 ----------------------
QWidget *area1 = new QWidget (m_topMenu);
area1->setFixedHeight (100);
area1->setStyleSheet ("background-color: #FFFFFF; border: 1px solid #CCCCCC; border-radius: 4px;");

// 功能区 1 布局（垂直：按钮行 + 标签）
QVBoxLayout *layout1 = new QVBoxLayout (area1);
layout1->setContentsMargins (5, 5, 5, 5);
layout1->setSpacing (5);

// 功能区 1 按钮布局（水平）
QHBoxLayout *btnLayout1 = new QHBoxLayout ();
btnLayout1->setContentsMargins (0, 0, 0, 0);
btnLayout1->setSpacing (10);

// 创建功能按钮（固定尺寸 60x60）
QPushButton *cashierBtn = new QPushButton ("收银台", area1);
cashierBtn->setFixedSize (60, 60);
QPushButton *stockInBtn = new QPushButton ("商品入库", area1);
stockInBtn->setFixedSize (60, 60);
QPushButton *productProfileListBtn = new QPushButton ("商品档案", area1);
productProfileListBtn->setFixedSize (60, 60);

// 按钮添加到按钮布局
btnLayout1->addWidget (cashierBtn);
btnLayout1->addWidget (stockInBtn);
btnLayout1->addWidget (productProfileListBtn);

// 功能区标签（标识功能分类）
QLabel *label1 = new QLabel ("进销存管理", area1);
label1->setFixedHeight (20);
label1->setAlignment (Qt::AlignCenter);
label1->setStyleSheet ("background-color: #FFD700; color: #333333; font-weight: bold; border-radius: 2px;");

// 按钮布局和标签添加到功能区 1 布局
layout1->addLayout (btnLayout1);
layout1->addWidget (label1);

//---------------------- 功能区 2：统计分析 ----------------------
QWidget *area2 = new QWidget (m_topMenu);
area2->setFixedHeight (100);
area2->setStyleSheet ("background-color: #FFFFFF; border: 1px solid #CCCCCC; border-radius: 4px;");

// 功能区 2 布局（垂直）
QVBoxLayout *layout2 = new QVBoxLayout (area2);
layout2->setContentsMargins (5, 5, 5, 5);
layout2->setSpacing (5);

// 功能区 2 按钮布局（水平）
QHBoxLayout *btnLayout2 = new QHBoxLayout ();
btnLayout2->setContentsMargins (0, 0, 0, 0);
btnLayout2->setSpacing (10);

// 创建统计分析相关按钮
QPushButton *productBrowseBtn = new QPushButton ("商品浏览", area2);
productBrowseBtn->setFixedSize (60, 60);
QPushButton *stockStatsBtn = new QPushButton ("入库统计", area2);
stockStatsBtn->setFixedSize (60, 60);
QPushButton *saleStatsBtn = new QPushButton ("销售统计", area2);
saleStatsBtn->setFixedSize (60, 60);
QPushButton *saleDetailBtn = new QPushButton ("销售明细", area2);
saleDetailBtn->setFixedSize (60, 60);
QPushButton *saleAnalysisBtn = new QPushButton ("销售分析", area2);
saleAnalysisBtn->setFixedSize (60, 60);

// 按钮添加到按钮布局
btnLayout2->addWidget (productBrowseBtn);
btnLayout2->addWidget (stockStatsBtn);
btnLayout2->addWidget (saleStatsBtn);
btnLayout2->addWidget (saleDetailBtn);
btnLayout2->addWidget (saleAnalysisBtn);

// 功能区标签
QLabel *label2 = new QLabel ("统计分析", area2);
label2->setFixedHeight (20);
label2->setAlignment (Qt::AlignCenter);
label2->setStyleSheet ("background-color: #FFA500; color: #333333; font-weight: bold; border-radius: 2px;");

// 按钮布局和标签添加到功能区 2 布局
layout2->addLayout (btnLayout2);
layout2->addWidget (label2);

//---------------------- 功能区 3：商品出库 ----------------------
QWidget *area3 = new QWidget (m_topMenu);
area3->setFixedHeight (100);
area3->setStyleSheet ("background-color: #FFFFFF; border: 1px solid #CCCCCC; border-radius: 4px;");

// 功能区 3 布局（垂直）
QVBoxLayout *layout3 = new QVBoxLayout (area3);
layout3->setContentsMargins (5, 5, 5, 5);
layout3->setSpacing (5);

// 功能区 3 按钮布局（水平）
QHBoxLayout *btnLayout3 = new QHBoxLayout ();
btnLayout3->setContentsMargins (0, 0, 0, 0);
btnLayout3->setSpacing (10);

// 创建商品出库相关按钮
QPushButton *stockOutBtn = new QPushButton ("商品出库", area3);
stockOutBtn->setFixedSize (60, 60);
QPushButton *stockOutStatsBtn = new QPushButton ("出库统计", area3);
stockOutStatsBtn->setFixedSize (60, 60);

// 按钮添加到按钮布局
btnLayout3->addWidget (stockOutBtn);
btnLayout3->addWidget (stockOutStatsBtn);

// 功能区标签
QLabel *label3 = new QLabel ("商品出库", area3);
label3->setFixedHeight (20);
label3->setAlignment (Qt::AlignCenter);
label3->setStyleSheet ("background-color: #90EE90; color: #333333; font-weight: bold; border-radius: 2px;");

// 按钮布局和标签添加到功能区 3 布局
layout3->addLayout (btnLayout3);
layout3->addWidget (label3);

//---------------------- 功能区 4：系统功能 ----------------------
QWidget *area4 = new QWidget (m_topMenu);
area4->setFixedHeight (100);
area4->setStyleSheet ("background-color: #FFFFFF; border: 1px solid #CCCCCC; border-radius: 4px;");

// 功能区 4 布局（垂直）
QVBoxLayout *layout4 = new QVBoxLayout (area4);
layout4->setContentsMargins (5, 5, 5, 5);
layout4->setSpacing (5);

// 功能区 4 按钮布局（水平）
QHBoxLayout *btnLayout4 = new QHBoxLayout ();
btnLayout4->setContentsMargins (0, 0, 0, 0);
btnLayout4->setSpacing (10);

// 创建系统功能相关按钮
QPushButton *refreshBtn = new QPushButton ("刷新", area4);
refreshBtn->setFixedSize (60, 60);
QPushButton *printBtn = new QPushButton ("打印", area4);
printBtn->setFixedSize (60, 60);
QPushButton *exportBtn = new QPushButton ("导出", area4);
exportBtn->setFixedSize (60, 60);
QPushButton *otherBtn = new QPushButton ("其他", area4);
otherBtn->setFixedSize (60, 60);
QPushButton *wechatBtn = new QPushButton ("微信", area4);
wechatBtn->setFixedSize (60, 60);
QPushButton *mobileBtn = new QPushButton ("手机版", area4);
mobileBtn->setFixedSize (60, 60);
QPushButton *helpBtn = new QPushButton ("帮助", area4);
helpBtn->setFixedSize (60, 60);
QPushButton *exitBtn = new QPushButton ("退出", area4);
exitBtn->setFixedSize (60, 60);

// 按钮添加到按钮布局
btnLayout4->addWidget (refreshBtn);
btnLayout4->addWidget (printBtn);
btnLayout4->addWidget (exportBtn);
btnLayout4->addWidget (otherBtn);
btnLayout4->addWidget (wechatBtn);
btnLayout4->addWidget (mobileBtn);
btnLayout4->addWidget (helpBtn);
btnLayout4->addWidget (exitBtn);

// 功能区标签
QLabel *label4 = new QLabel ("系统功能", area4);
label4->setFixedHeight (20);
label4->setAlignment (Qt::AlignCenter);
label4->setStyleSheet ("background-color: #87CEFA; color: #333333; font-weight: bold; border-radius: 2px;");

// 按钮布局和标签添加到功能区 4 布局
layout4->addLayout (btnLayout4);
layout4->addWidget (label4);

//---------------------- 组装顶部菜单 ----------------------
// 将 4 个功能区添加到顶部菜单主布局，末尾添加拉伸项（右对齐）
mainMenuLayout->addWidget (area1);
mainMenuLayout->addWidget (area2);
mainMenuLayout->addWidget (area3);
mainMenuLayout->addWidget (area4);
mainMenuLayout->addStretch ();

//---------------------- 统一按钮样式 ----------------------
// 设置所有按钮的默认 /hover/pressed 状态样式，保持界面一致性
QString buttonStyle =
"QPushButton {"
"background-color: #FFFFFF;"
"color: #333333;"
"border: 1px solid #CCCCCC;"
"border-radius: 3px;"
"font-size: 12px;"
"font-family: Microsoft YaHei;"
"}"
"QPushButton:hover {" // 鼠标悬浮状态
"background-color: #F5F5F5;"
"border-color: #BBBBBB;"
"}"
"QPushButton:pressed {" // 鼠标按下状态
"background-color: #E8E8E8;"
"border-color: #AAAAAA;"
"}";

// 遍历顶部菜单所有按钮，应用统一样式
QList<QPushButton*> buttons = m_topMenu->findChildren<QPushButton*>();
foreach (QPushButton *btn, buttons) {
btn->setStyleSheet (buttonStyle);
}

//---------------------- 绑定按钮点击事件（信号槽） ----------------------
// 1. 收银台按钮：创建收银台窗口并全屏显示
connect (cashierBtn, &QPushButton::clicked, this, [this] {
// 创建收银台所需的数据访问层（DAO）和业务层对象
ProductDAO* productDAO = new ProductDAO (m_db);
MemberDAO* memberDAO = new MemberDAO (m_db);
InventoryDAO* inventoryDAO = new InventoryDAO (m_db);
OrderService* orderService = new OrderService (this);
PaymentProcessor* paymentProcessor = new PaymentProcessor ();

// 初始化收银台窗口（传入依赖对象，设置父窗口）
m_cashier = new CashierDialog (
productDAO,
memberDAO,
inventoryDAO,
orderService,
paymentProcessor,
this
);

// 设置窗口属性：独立窗口、显示标题栏和关闭按钮、关闭时自动释放内存
m_cashier->setWindowFlags (Qt::Window | Qt::WindowTitleHint | Qt::WindowCloseButtonHint);
m_cashier->setAttribute (Qt::WA_DeleteOnClose);
m_cashier->showFullScreen (); // 全屏显示收银台
});

//商品入库按钮：切换堆叠窗口到商品档案页面（索引 0）
connect (stockInBtn, &QPushButton::clicked, this, [this] {
if (m_stackedWidget) m_stackedWidget->setCurrentIndex(0);
});


//商品档案按钮：切换堆叠窗口到商品档案页面（索引 1）
connect (productProfileListBtn, &QPushButton::clicked, this, [this] {
if (m_stackedWidget) m_stackedWidget->setCurrentIndex(1);
});

//商品浏览按钮：切换堆叠窗口到商品浏览页面（索引 2）
connect (productBrowseBtn, &QPushButton::clicked, this, [this] {
if (m_stackedWidget) m_stackedWidget->setCurrentIndex(2);
});

//入库统计按钮：切换堆叠窗口到入库统计页面（索引 3）
connect (stockStatsBtn, &QPushButton::clicked, this, [this] {
if (m_stackedWidget) m_stackedWidget->setCurrentIndex(3);
});

//销售统计按钮：切换堆叠窗口到销售统计页面（索引 4）
connect (saleStatsBtn, &QPushButton::clicked, this, [this] {
if (m_stackedWidget) m_stackedWidget->setCurrentIndex(4);
});

//销售分析按钮：切换堆叠窗口到销售分析页面（索引 5）
connect (saleAnalysisBtn, &QPushButton::clicked, this, [this] {
if (m_stackedWidget) m_stackedWidget->setCurrentIndex(5);
});
}

QMap<QString, QVariant> im::getCurrentUser() const
{
    return m_currentUser;
}
